package api

import (
	"fmt"
	"service/app/control"
	"service/app/dto"
	"service/app/mode"

	"github.com/gin-gonic/gin"
)

var (
	UserPermList  = 300001
	MenuPermList  = 300002
	PmCreateFail  = 300003
	PmAddListFail = 300004
	PATHACROLES   = 300005
	PMLISTGET     = 300006
	PMSQLEXITS    = 300007
	PMURLRELROLE  = 300008
	PMPAGINATION  = 300009
	PMDEL         = 300010
	PMEDIT        = 300011
)

type PmApi struct {
	BaseApi
	Contr *control.PmControl
}

func PmApiCreate() PmApi {
	return PmApi{
		BaseApi: *BaseApi{}.BaseApiInit(),
		Contr:   control.PmInit(),
	}
}

// @Summary 修改API
// @Description 修改API
// @Param id path dto.ReqUriIdDto true "api ID"
// @Param object body dto.Ipm_add true "api 修改的属性"
// @Tags pm
// @Router /api/v1/pm/{id} [PUT]
// @Security ApiKeyAuth
func (m PmApi) PmEdit(ctx *gin.Context) {
	var id dto.ReqUriIdDto
	var api mode.Db_pm
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, ReqUri: true, Dto: &id, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &api, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.Contr.PmEditC(&id, &api); err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: PMEDIT})
		return
	}
	m.Okay(ResponseJson{Msg: fmt.Sprintf("修改 %v 成功!", id.Id)})
}

// @Summary 删除pm
// @Description
// @Tags pm
// @Router /api/v1/pm/{id} [delete]
// @Param id path dto.ReqUriIdDto true "pm ID"
// @Security ApiKeyAuth
func (m PmApi) Pm_del(ctx *gin.Context) {
	var id dto.ReqUriIdDto
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, ReqUri: true, Dto: &id, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.Contr.Pm_delC(id); err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: PMURLRELROLE})
		return
	}
	m.Okay(ResponseJson{Msg: fmt.Sprintf("删除 %v", id.Id)})
}

// @Summary 从pm.url[] 关联角色
// @Description
// @Tags pm
// @Router /api/v1/pm/urlrelrole/{id} [put]
// @Param id path dto.ReqUriIdDto true "userid ID"
// @Param object body dto.Ipm_pmUrlList true "pm.url[]"
// @Security ApiKeyAuth
func (m PmApi) PmUrlRelRole(ctx *gin.Context) {
	var id dto.ReqUriIdDto
	var pmUrlList dto.Ipm_pmUrlList
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, ReqUri: true, Dto: &id, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &pmUrlList, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	err := m.Contr.PmUrlRelRoleC(&id, &pmUrlList)
	if err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: PMDEL})
		return
	}
	m.Okay(ResponseJson{Msg: "角色perm url关联成功!"})
}

// @Summary 判断路径是否创建
// @Description
// @Tags pm
// @Router /api/v1/pm/exites [post]
// @Param id path int true "userid ID"
// @Param object body dto.ReqUriIdDto true "角色组"
// @Security ApiKeyAuth
func (m PmApi) PmSqlExits(ctx *gin.Context) {
	var param dto.Ipm_add
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &param, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	exites_menu, err := m.Contr.PmSqlExitsC(&param)
	if err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: PMSQLEXITS})
		return
	}
	m.Okay(ResponseJson{Data: exites_menu})
}

// @Summary 获取permlist
// @Description 获取permlist
// @Tags pm
// @Router /api/v1/pm/ [GET]
// @Security ApiKeyAuth
func (m PmApi) Pm_R_list(ctx *gin.Context) {
	m.Ctx = ctx
	list, err := m.Contr.Pm_R_listC()
	if err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: PMLISTGET})
		return
	}
	m.Okay(ResponseJson{Msg: "path premission关键角色成功!", Data: &list})
}

// @Summary path premission关键角色
// @Description Roles []int,id为perm path
// @Tags pm
// @Router /api/v1/pm/role/{id} [PUT]
// @Param id path int true "userid ID"
// @Param object body dto.ReqUriIdDto true "角色组"
// @Security ApiKeyAuth
func (m PmApi) PmAcRoles(ctx *gin.Context) {
	var id dto.ReqUriIdDto
	var param dto.Ipm_roles
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, ReqUri: true, Dto: &id, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &param, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.Contr.PmAcRolesC(&id, &param); err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: PATHACROLES})
		return
	}
	m.Okay(ResponseJson{Msg: "path premission关键角色成功!"})
}

// @Summary  准备弃用 获取用户限列表携带角色列表
// @Description 获取用户限列表携带角色列表
// @Tags pm
// @Router /api/v1/pm/auth [GET]
// @Param page query int true "页码" default(1)
// @Param limit query int true "每页数量" default(10)
// @Param keyword query string false "关键字"
// @Param order query string  false "排序" Enums(ASC,DESC)
// @Security ApiKeyAuth
// func (m PmApi) PmListAll_old(ctx *gin.Context) {
// 	var pageOpt dto.ReqPaginat
// 	err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &pageOpt, ReqQey: true}).GetBaseErr()
// 	if err != nil {
// 		m.Fail(ResponseJson{Msg: err.Error()})
// 		return
// 	}

// 	list, total, err := m.Contr.PmList(&pageOpt)
// 	if err != nil {
// 		m.Fail(ResponseJson{Code: UserPermList, Msg: "获取用户详细列表失败!"})
// 		return
// 	}
// 	m.Okay(ResponseJson{Data: list, Total: total})
// }

// @Tags pm
// @Summary 用户许可menus列表
// @Description 用户许可menus列表
// @Router /api/v1/pm/auth/ [GET]
// @Security ApiKeyAuth
func (m PmApi) PmAuthList_old(ctx *gin.Context) {
	m.Ctx = ctx
	profile := m.GetCtxUser()
	//test 管理员测试
	list, err := m.Contr.PmAuthC(&profile.Roles, profile.User)
	if err != nil {
		m.Fail(ResponseJson{Code: MenuPermList})
	}
	if len(*list) == 0 {
		list = &[]mode.Db_menu{}
		// list = &(make([]mode.Db_menu, 0))
	}
	m.Okay(ResponseJson{Msg: "获取用户许可menus列表成功!", Data: list})
}

// @Tags pm
// @Summary 创建path
// @Description 创建path
// @Router /api/v1/pm/list [POST]
// @Param object body dto.Ipm_add true "path"
// @Security ApiKeyAuth
func (m PmApi) PmCreate(ctx *gin.Context) {
	var ac dto.Ipm_add
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Valid: true, Dto: &ac}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.Contr.PmCreateC(&ac); err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: PmCreateFail})
		return
	}
	m.Okay(ResponseJson{Msg: "创建成功!", Data: &ac})
}

// @Tags pm
// @Summary 创建path list列表
// @Description 创建path list列表 !!有可能未写入也提示成功,unique相同
// @Router /api/v1/pm/list [POST]
// @Param object body dto.Ipm_add true "path []dto.Ipm_add list"
// @Security ApiKeyAuth
// bug 有可能未写入也提示成功,unique相同
func (m PmApi) PmAddList(ctx *gin.Context) {
	var ac dto.Ipm_addList
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Valid: true, Dto: &ac}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	if err := m.Contr.PmAddListC(&ac); err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: PmAddListFail})
		return
	}
	m.Okay(ResponseJson{Msg: "创建成功!", Data: &ac})
}

// @Summary 获取perm pagination list
// @Description 获取perm pagination list /api/v1/pm/page?page=1&limit=10&keyword=url&key=url&order=ASC
// @Tags pm, api
// @Param page query int true "页码" default(1)
// @Param limit query int true "每页数量" default(10)
// @Param keyword query string false "关键字"
// @Param order query string  false "排序" Enums(ASC,DESC)
// @Router /api/v1/pm/page [GET]
// @Security ApiKeyAuth
func (m PmApi) Pmlist_page(ctx *gin.Context) {
	var pageOpt dto.ReqPaginatPm
	// 动态修改校验TAG
	// newTags := map[string]string{
	// 	"Key":      `form:"key" json:"key" binding:"omitempty,oneof=id created_at updatad_at fullpath url method desc" required_msg:"key 为选填项目,key搜索的属性名必须为fullpath url method desc id created_at updatad_at"`,
	// 	"OrderKey": `form:"orderkey" json:"orderkey" binding:"omitempty,oneof=id created_at updatad_at fullpath url method desc" required_msg:"key 为选填项目,key搜索的属性名必须为fullpath url method desc id created_at updatad_at"`,
	// }
	if err := m.BaseReqHandle(&IBaseApiParams{Ctx: ctx, Dto: &pageOpt, ReqQey: true, Valid: true}).GetBaseErr(); err != nil {
		m.Fail(ResponseJson{Msg: err.Error()})
		return
	}
	transOpt := dto.ReqPaginat{Page: pageOpt.Page, Limit: pageOpt.Limit, Keyword: pageOpt.Keyword, Order: pageOpt.Order, Key: pageOpt.Key, OrderKey: pageOpt.OrderKey}

	list, total, err := m.Contr.Pmlist_pageC(&transOpt)
	if err != nil {
		m.Fail(ResponseJson{Msg: err.Error(), Code: PMPAGINATION})
		return
	}
	m.Okay(ResponseJson{Msg: "获取perm pagination 成功", Total: total, Data: *list})
}
